//
//  HMSlideView.m
//  02-图片轮播器
//
//  Created by 教师机 on 16/9/18.
//  Copyright © 2016年 itheima. All rights reserved.
//

#import "HMSlideView.h"
#import "Masonry.h"
#import "HMSlideViewCell.h"

#define hmScaleSeed 1

//什么时候可以写这个类中类,就是这个类,只为下面的那个类服务.
/*____________________________________________________*/
#pragma mark - 以下是这个HMSlideViewFlowLayout类的代码
@interface  HMSlideViewFlowLayout : UICollectionViewFlowLayout

@end

@implementation HMSlideViewFlowLayout

- (void)prepareLayout {
    [super prepareLayout];
    //1.拿到view的size
    CGSize size = self.collectionView.bounds.size;
    //2.设置item的大小
    self.itemSize = size;
    //3.设置最小的item间距和行间距
    self.minimumLineSpacing= 0 ;
    self.minimumInteritemSpacing = 0;
    //4.设置滚动方向
    self.scrollDirection = UICollectionViewScrollDirectionHorizontal;

};

@end


/*____________________________________________________*/
#pragma mark - 以下是HMSlideView这个类的代码
/**
 *  可重用cell标识符
 */
static NSString * cellID = @"cellID";

@interface HMSlideView ()<UICollectionViewDataSource,UICollectionViewDelegate>
@property(nonatomic,weak)UICollectionView * collectionView;
@property(nonatomic,weak)UIPageControl * pageControl;
@property(nonatomic,weak)NSTimer * timer;
@end

@implementation HMSlideView
//纯代码的入口
- (instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        [self setupUI];
    }
    return self;
}
//ui入口
- (void)awakeFromNib {
    [self setupUI];
}

#pragma mark - UICollectionViewDataSource 实现数据源协议方法
-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
    return _urls.count * 2 * hmScaleSeed;
}

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    //1.取出cell
    HMSlideViewCell * cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellID forIndexPath:indexPath];
    
    //不管有多少个item,这个cell只有两个
//    NSLog(@"%p",cell);
    
    //2.设置cell
    cell.backgroundColor  = [UIColor cz_randomColor];
    //把cell的真实url传递给cell的属性url
    NSInteger index = indexPath.item % _urls.count;
    cell.url = _urls[index];
    //3.返回cell
    return cell;
}


#pragma mark - UICollectionViewDelegate 实现代理方法, 实际上要滚动,实现的都是scorllView的代理方法.
//监听滚动停止的方法
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
//    NSLog(@"滚动停止了...");
    NSInteger page = _collectionView.contentOffset.x / _collectionView.bounds.size.width;
    //NSLog(@"第%zd页",page);
    
    //计算collectionView的某一个组中出有多少个item
    NSInteger itemNumber = [_collectionView numberOfItemsInSection:0];
    //判断是不是最后一个item
    if (page == itemNumber-1) {
//        NSLog(@"到了最后一页,我要跳转到第2页");
        //取到要跳转的item的indexPath
        NSIndexPath * indexPath = [NSIndexPath indexPathForItem: _urls.count-1 inSection:0];
        //利用方法让collectionView跳转.
        [_collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionLeft animated:NO];
    }
    
    if (page == 0) {
//        NSLog(@"到了第0页,我要跳转到第3页");
        //取到要跳转的item的indexPath
        NSIndexPath * indexPath = [NSIndexPath indexPathForItem: _urls.count inSection:0];
        //利用方法让collectionView跳转.
        [_collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionLeft animated:NO];
    }
}
//监听滚动
-(void)scrollViewDidScroll:(UIScrollView *)scrollView {
    NSInteger page = _collectionView.contentOffset.x / _collectionView.bounds.size.width + 0.5;
    
//    NSLog(@"第%zd页",page);
    _pageControl.currentPage = page % _urls.count;
}
//动画滚动结束执行方法
-(void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView {
//    NSLog(@".....动画滚动停止");
    //在这里,手动的调用滚动停止方法,从而达到到了最后一页可以跳转到第2页的效果.
    [self scrollViewDidEndDecelerating:_collectionView];
}
//监听用户的拖拽开始
-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
//    NSLog(@"我开始拖拽了...");
    //开始拖拽了,就应该停止计时器.
    _timer.fireDate = [NSDate distantFuture];
//    NSLog(@"%@",[NSDate distantFuture]);
}
//监听用户的拖拽结束
-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
// NSLog(@"我结束拖拽了...");
    //停止拖拽了,要从新开始计时器.
    _timer.fireDate = [NSDate dateWithTimeIntervalSinceNow:2.0];
}


-(void)dealloc{
    //NSLog(@"轮播器页面死亡");
    
    //想让时钟停止,或者没有效果啊,能写在这个方法里面吗?  所以不能写在这里.
}

/**
 *  时钟不使用之前,一定要记得销毁.
 */
-(void)removeFromSuperview {
    [super removeFromSuperview];
    //想让时钟停止,或者没有效果啊,能写在这个方法里面吗?
//    NSLog(@"我从父视图中移除了");
    [_timer invalidate]; //轮播器视图移除了,这个时钟就要设置成失效.
}


#pragma mark - 重写setter方法
/**
 *  重写setter方法
 */
-(void)setUrls:(NSArray *)urls {
    
    if (urls == nil) return;
    
    _urls = urls;
    
    //避免时钟被重复的添加到运行循环中.
    if (_timer != nil) {
//        return; //方法1: 缺点: 如果有数据更新,就不会执行后面的代码,不会加载到最新的数据.
        [_timer invalidate]; //方法2: 缺点:看起来又要重新开始. 推荐使用.
        
    }
    
    
    //1.加载了真实数据之后,要重新的调用数据源协议方法.
    [_collectionView reloadData];
    
    //2.可以让collectionView一开始的显示内容,在中间.
    //2.1:方法1,设置collectionView的conten0ffset
//    CGFloat width = _collectionView.bounds.size.width * _urls.count;
//    _collectionView.contentOffset = CGPointMake(width, 0);
    //2.2:方法2,使用方法让collectionView调转到某一个item上
    NSIndexPath * indexPath = [NSIndexPath indexPathForItem:_urls.count * hmScaleSeed inSection:0];
    
    [_collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionLeft animated:NO];
    
    
    //3.设置pageControl的真实个数
    _pageControl.numberOfPages = _urls.count;
    
    
    //4.添加计时器
    //参数介绍:1.时间间隔,多长时间触发一次计时器.
    //        2.监听时钟时间的对象
    //        3.当计时器被触发了,调用的监听方法.
    //        4.当时钟被触发的时候,传递给监听方法的对象.
    //        5.是否重复触发
//    [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updataNext) userInfo:nil repeats:YES];
  //要把计时器放入到运行循环中去.使用NSRunLoopCommonModes模式,这种模式包含了滚动和默认的模式.
   NSTimer * timer =  [NSTimer timerWithTimeInterval:3.0 target:self selector:@selector(updataNext) userInfo:nil repeats:YES];
    [[NSRunLoop currentRunLoop]addTimer:timer forMode:NSRunLoopCommonModes];
    
    //5.用属性记录计时器
    _timer = timer;
}

#pragma mark - 时钟调用方法
/**
 *  时钟调用方法
 */
- (void)updataNext {
    //NSLog(@"时钟被触发了...");
    //1.取出当前显示的item的indexPath
    NSIndexPath * indexPath =  [_collectionView indexPathsForVisibleItems].lastObject;
    
    if (indexPath.item <=1) return;
    
    //2.找到当前的item的下一个item的indexPath  ,indexPath.item++;//item是只读属性,不能直接++
    NSIndexPath * nextIndexPath = [NSIndexPath indexPathForItem:indexPath.item+1 inSection:0];
    
    //3.把上面找到的下一个item作为当前显示的item.
    [_collectionView scrollToItemAtIndexPath:nextIndexPath atScrollPosition:UICollectionViewScrollPositionLeft animated:YES];
    
    
}




#pragma mark - 设置界面
- (void)setupUI {
    //1.创建控件
    //1.1创建collectionView
    HMSlideViewFlowLayout * layout = [[HMSlideViewFlowLayout alloc]init];
    
    UICollectionView * cv = [[UICollectionView alloc]initWithFrame:self.bounds collectionViewLayout:layout];
    
    cv.backgroundColor = [UIColor clearColor];
    [self addSubview:cv];
    
    //设置collectionview的属性
    cv.bounces = NO;
    cv.pagingEnabled = YES;
    cv.showsVerticalScrollIndicator = NO;
    cv.showsHorizontalScrollIndicator = NO;
    
    
    //注册cell
    [cv registerClass:[HMSlideViewCell class] forCellWithReuseIdentifier:cellID];
    //设置数据源/设置代理
    cv.dataSource = self;
    cv.delegate = self;
    
    //1.2创建pageControl
    UIPageControl * pageC = [[UIPageControl alloc]init];
    pageC.numberOfPages = 5;
    pageC.currentPage = 0;
    pageC.pageIndicatorTintColor = [UIColor cz_colorWithHex:0x706044];
    pageC.currentPageIndicatorTintColor = [UIColor cz_colorWithHex:0xdcaa66];
    pageC.userInteractionEnabled = NO;
    [self addSubview:pageC];
    
    //2.自动布局
    [cv mas_makeConstraints:^(MASConstraintMaker *make) {
        make.edges.equalTo(self);
    }];
    
    [pageC mas_makeConstraints:^(MASConstraintMaker *make) {
        make.bottom.equalTo(self).mas_offset(-5);
        make.centerX.equalTo(self);
    }];
    
    //3.用属性记录控件
    _collectionView = cv;
    _pageControl = pageC;
}

@end
